/*
ID: quxiao82
LANG: C++
PROG: rect1
*/


#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <list>
#include <map>
using namespace std ;

const int MAX = 100;

struct Rect
{
       int llx, lly;
       int urx, ury;
       int color;
       int remove;

public:
       Rect( int, int, int, int, int);
       Rect();
};

list<Rect> rectList;
list<Rect>::iterator it;
int a, b, n;
map<int , int > ans ;
map<int , int >::iterator ansIdx ;

Rect::Rect () {}

Rect::Rect (int llx , int lly , int urx , int ury , int color )
{
       this-> llx = llx;
       this-> lly = lly;
       this-> urx = urx;
       this-> ury = ury;
       this-> color = color;
       this-> remove = 0;
}

bool operator == (Rect r1 , Rect r2 )
{
       return ( r1.color == r2.color && r1.llx == r2.llx && r1.lly == r2. lly && r1. urx == r2. ury && r1. ury == r2. ury);
}

bool operator < (Rect r1 , Rect r2 )
{
       return true ;
}

bool Intersect(Rect r1, Rect r2)
{
       double cx1, cy1, cx2, cy2, w, h;
       cx1 = ( r1. llx + r1. urx) / 2.0;
       cy1 = ( r1. lly + r1. ury) / 2.0;
       cx2 = ( r2. llx + r2. urx) / 2.0;
       cy2 = ( r2. lly + r2. ury) / 2.0;
       w = (( r1. urx- r1. llx) + ( r2. urx- r2. llx)) / 2.0;
       h = (( r1. ury- r1. lly) + ( r2. ury- r2. lly)) / 2.0;

       return ( fabs(cx1-cx2) < w && fabs(cy1-cy2) < h );
}

bool IsRect(Rect r)
{
       return (r.llx < r.urx && r.lly < r.ury );
}

int Area (Rect r)
{
       return ( r.urx - r.llx ) * ( r.ury - r.lly );
}

bool PointInRect (int x , int y , Rect r )
{
       return ( r.llx <= x && x <= r.urx && r.lly <= y && y <= r.ury );
}

list<Rect> BreakRect (Rect pre, Rect cur)
{
       list< Rect> tmpList;
       if ( cur. llx <= pre. llx && cur. lly < pre. ury && cur. lly > pre. lly
            && cur. urx > pre. llx && cur. urx < pre. urx && cur. ury >= pre. ury )
      {
             tmpList. push_back( Rect( cur. urx, cur. lly, pre. urx, pre. ury, pre. color));
             tmpList. push_back( Rect( pre. llx, pre. lly, cur. urx, cur. lly, pre. color));
             tmpList. push_back( Rect( cur. urx, pre. lly, pre. urx, cur. lly, pre. color));
      }
       else if ( cur. llx > pre. llx && cur. llx < pre. urx && cur. lly > pre. lly && cur. lly < pre. ury
            && cur. urx >= pre. urx && cur. ury >= pre. ury )
      {
             tmpList. push_back( Rect( pre. llx, cur. lly, cur. llx, pre. ury, pre. color));
             tmpList. push_back( Rect( pre. llx, pre. lly, cur. llx, cur. lly, pre. color));
             tmpList. push_back( Rect( cur. llx, pre. lly, pre. urx, cur. lly, pre. color));
      }
       else if ( cur. llx <= pre. llx && cur. lly <= pre. lly
            && cur. urx > pre. llx && cur. urx < pre. urx && cur. ury > pre. lly && cur. ury < pre. ury )
      {
             tmpList. push_back( Rect( pre. llx, cur. ury, cur. urx, pre. ury, pre. color));
             tmpList. push_back( Rect( cur. urx, cur. ury, pre. urx, pre. ury, pre. color));
             tmpList. push_back( Rect( cur. urx, pre. lly, pre. urx, cur. ury, pre. color));
      }
       else if ( cur. llx > pre. llx && cur. llx < pre. urx && cur. lly <= pre. lly
            && cur. urx >= pre. urx && cur. ury > pre. lly && cur. ury < pre. ury )
      {
             tmpList. push_back( Rect( pre. llx, cur. ury, cur. llx, pre. ury, pre. color));
             tmpList. push_back( Rect( cur. llx, cur. ury, pre. urx, pre. ury, pre. color));
             tmpList. push_back( Rect( pre. llx, pre. lly, cur. llx, cur. ury, pre. color));
      }
       else if ( cur. llx > pre. llx && cur. urx < pre. urx && cur. lly > pre. lly && cur. ury < pre. ury )
      {
             tmpList. push_back( Rect( pre. llx, cur. ury, pre. urx, pre. ury, pre. color));
             tmpList. push_back( Rect( pre. llx, cur. lly, cur. llx, cur. ury, pre. color));
             tmpList. push_back( Rect( cur. urx, cur. lly, pre. urx, cur. ury, pre. color));
             tmpList. push_back( Rect( pre. llx, pre. lly, pre. urx, cur. lly, pre. color));
      }
       else if ( cur. llx > pre. llx && cur. urx < pre. urx && cur. lly <= pre. lly && cur. ury >= pre. ury )
      {
             tmpList. push_back( Rect( pre. llx, pre. lly, cur. llx, pre. ury, pre. color));
             tmpList. push_back( Rect( cur. urx, pre. lly, pre. urx, pre. ury, pre. color));
      }
       else if ( cur. lly > pre. lly && cur. ury < pre. ury && cur. llx <= pre. llx && cur. urx >= pre. urx )
      {
             tmpList. push_back( Rect( pre. llx, cur. ury, pre. urx, pre. ury, pre. color));
             tmpList. push_back( Rect( pre. llx, pre. lly, pre. urx, cur. lly, pre. color));
      }
       else if ( cur. llx <= pre. llx && cur. urx > pre. llx && cur. urx < pre. urx
            && cur. lly > pre. lly && cur. ury < pre. ury )
      {
             tmpList. push_back( Rect( pre. llx, cur. ury, cur. urx, pre. ury, pre. color));
             tmpList. push_back( Rect( pre. llx, pre. lly, cur. urx, cur. lly, pre. color));
             tmpList. push_back( Rect( cur. urx, pre. lly, pre. urx, pre. ury, pre. color));
      }
       else if ( cur. llx > pre. llx && cur. urx < pre. urx &&
             cur. lly > pre. lly && cur. lly < pre. ury && cur. ury >= pre. ury )
      {
             tmpList. push_back( Rect( pre. llx, cur. lly, cur. llx, pre. ury, pre. color));
             tmpList. push_back( Rect( cur. urx, cur. lly, pre. urx, pre. ury, pre. color));
             tmpList. push_back( Rect( pre. llx, pre. lly, pre. urx, cur. lly, pre. color));
      }
       else if ( cur. llx > pre. llx && cur. llx < pre. urx && cur. urx >= pre. urx
            && cur. lly > pre. lly && cur. ury < pre. ury )
      {
             tmpList. push_back( Rect( pre. llx, pre. lly, cur. llx, pre. ury, pre. color));
             tmpList. push_back( Rect( cur. llx, cur. ury, pre. urx, pre. ury, pre. color));
             tmpList. push_back( Rect( cur. llx, pre. lly, pre. urx, cur. lly, pre. color));
      }
       else if ( cur. llx > pre. llx && cur. urx < pre. urx
            && cur. lly <= pre. lly && cur. ury > pre. lly && cur. ury < pre. ury )
      {
             tmpList. push_back( Rect( pre. llx, cur. ury, pre. urx, pre. ury, pre. color));
             tmpList. push_back( Rect( pre. llx, pre. lly, cur. llx, cur. ury, pre. color));
             tmpList. push_back( Rect( cur. urx, pre. lly, pre. urx, cur. ury, pre. color));
      }
       else if ( cur. llx <= pre. llx && cur. urx >= pre. urx
            && cur. lly > pre. lly && cur. lly < pre. ury && cur. ury >= pre. ury )
      {
             tmpList. push_back( Rect( pre. llx, pre. lly, pre. urx, cur. lly, pre. color));
      }
       else if ( cur. llx <= pre. llx && cur. urx >= pre. urx
            && cur. lly <= pre. lly && cur. ury > pre. lly && cur. ury < pre. ury )
      {
             tmpList. push_back( Rect( pre. llx, cur. ury, pre. urx, pre. ury, pre. color));
      }
       else if ( cur. llx <= pre. llx && cur. urx > pre. llx && cur. urx < pre. urx
            && cur. lly <= pre. lly && cur. ury >= pre. ury )
      {
             tmpList. push_back( Rect( cur. urx, pre. lly, pre. urx, pre. ury, pre. color));
      }
       else if ( cur. llx > pre. llx && cur. llx < pre. urx && cur. urx >= pre. urx
            && cur. lly <= pre. lly && cur. ury >= pre. ury )
      {
             tmpList. push_back( Rect( pre. llx, pre. lly, cur. llx, pre. ury, pre. color));
      }

       return tmpList;
}

bool canRemove (const Rect r )
{
       return r.remove;
}

void Insert (Rect r)
{
       list< Rect> tmp, tmp2;
       for ( it = rectList. begin(); it != rectList. end(); ++ it)
      {
             if ( Intersect(* it, r) )
            {
//                printf("(%d, %d) (%d, %d) and (%d, %d) (%d, %d) intersect\n",
//                      it->llx, it->lly, it->urx, it->ury, r.llx, r.lly, r.urx, r.ury);
                   tmp2 = BreakRect(* it, r);
//                list<Rect>::iterator tmpIdx;
//                tmpIdx = it;
//                printf("tmp list:\n");
//                for (it = tmp2.begin(); it != tmp2.end(); ++it)
//                {
//                      printf("(%d, %d) (%d, %d) %d %d\n", it->llx, it->lly, it->urx, it->ury, it->color, Area(*it));
//                }
//                printf("***************\n");
//                it = tmpIdx;
                   tmp. splice( tmp. end(), tmp2);
                   it-> remove = 1;
            }
      }

       rectList. remove_if( canRemove);
       rectList. push_back( r);
       rectList. splice( rectList. end(), tmp);
//    for (it = rectList.begin(); it != rectList.end(); ++it)
//    {
//          printf("(%d, %d) (%d, %d) %d %d\n", it->llx, it->lly, it->urx, it->ury, it->color, Area(*it));
//    }
}

void Output ()
{
       ans. clear();
       for ( it = rectList. begin(); it != rectList. end(); ++ it)
      {
             ans[ it-> color] += Area(* it);
      }
       for ( ansIdx = ans. begin(); ansIdx != ans. end(); ++ ansIdx)
      {
             printf( "%d %d\n", ansIdx->first, ansIdx->second);
      }
}

void Input ()
{
       int i;
       Rect r;
       scanf( "%d%d%d", &a, &b, &n);
       r. remove = 0;
       r. color = 1;
       r. llx = r. lly = 0;
       r. urx = a;
       r. ury = b;
       rectList. push_back( r);
       for ( i = 0; i < n; i ++)
      {
             scanf( "%d%d%d%d%d", &r.llx, &r.lly, &r.urx, &r.ury, &r. color);
             Insert( r);
      }
}


int main ()
{
       freopen( "rect1.in", "r" , stdin );
       freopen( "rect1.out", "w" , stdout );

       Input();
       Output();

       return 0;
}
